import jieba
import jieba.posseg as pseg
import re

# 1）先构建词典
org_tag = ['公司', '有限公司', '大学', '政府', '人民政府', '总局']

def extract_org(text):
    # 2）对文本进行序列标注
    words_flags = pseg.lcut(text)
    print(f'words_flags-->{words_flags}')
    # 3）根据规则将词标注为S或E，其余标注为O
    words = [] # 存放分词
    labels = [] # 存放标注
    for word, flag in words_flags:
        # print(f'word-->{word}')
        # print(f'flag-->{flag}')
        words.append(word)
        # 根据规则去做具体的判断
        if flag == 'ns': # 如果词性是ns，即代表是地名，是机构名开始
            labels.append('S')
        elif word in org_tag: # 如果这个词在词典中，即代表机构名结束
            labels.append('E')
        else:
            labels.append('O')
    print(f'words-->{words}')
    print(f'labels-->{labels}')
    # 4）然后使用正则表达式从标注序列中取出机构名
    labels = ''.join(labels)
    print(f'labels-->{labels}')
    # 定义正则表达式
    pattern = re.compile('S+O*E+')
    # result = re.findall(pattern, labels)
    # print(f'result-->{result}')  # ['SOOOE', 'SOOOOOE']
    # finditer比findall结果更丰富，除了返回匹配结果，还会返回匹配的索引位置【返回的是一个Match对象的迭代器】
    result = re.finditer(pattern, labels)
    # print(f'result-->{list(result)}')  # 注意：迭代器，只能迭代一次，所以不能重复迭代

    # 取出具体的实体
    final_result = []
    for res in result:
        start = res.start()
        end = res.end()
        # print(f'start-->{start}')
        # print(f'end-->{end}')
        # 获取实体
        entity = ''.join(words[start:end])
        final_result.append(entity)
        # print(f'entity-->{entity}')

    # 结果返回
    return final_result


if __name__ == '__main__':
    text = "可在接到本决定书之日起六十日内向中国国家市场监督管理总局申请行政复议,杭州海康威视数字技术股份有限公司."
    print(extract_org(text))